home *** CD-ROM | disk | FTP | other *** search
/ CD Ware Multimedia 1995 May / cd Ware (Juegos) Epimundo.iso / DOS / PRGMMING / M2PROTOS.ZIP / NFIO.MOD < prev    next >
Encoding:
Modula Implementation  |  1991-02-09  |  3.9 KB  |  196 lines

  1. (*%F _fdata *)
  2. (*# call(seg_name => null) *)
  3. (*%E *)
  4. (*# module(implementation=>off) *)
  5. (*# data(seg_name => null) *)
  6. (*# call(o_a_copy => off) *)
  7. (*# check(stack=>off,
  8.           index=>off,
  9.           range=>off,
  10.           overflow=>off,
  11.           nil_ptr=>off) *)
  12.  
  13. IMPLEMENTATION MODULE NFIO;
  14.  
  15. (* A module for JPI Topspeed Modula-2 *)
  16. (* By Carl Neiburger
  17.    169 N. 25th St.
  18.    San Jose, Calif.
  19.  
  20.    CompuServe No. 72336,2257
  21.  
  22. NOTE: THIS IS AN ABRIDGED VERSION OF NFIO THAT INCLUDES
  23. PROCEDURES NEEDED FOR FILE TRANSFER PROTOCOLS
  24.  
  25. *)
  26.  
  27. FROM Str IMPORT Copy, Concat;
  28. IMPORT Lib;
  29.  
  30. CONST
  31.   MaxHandle = MaxOpenFiles+3;
  32.  
  33. VAR
  34.   EOFstat: ARRAY[0..MaxHandle] OF BOOLEAN;
  35.  
  36. PROCEDURE GetName(name: ARRAY OF CHAR; VAR fn: PathStr);
  37. BEGIN
  38.   Copy(fn,name);
  39.   fn[SIZE(fn)-1] := CHR(0);
  40. END GetName;
  41.  
  42. PROCEDURE Create(Name: ARRAY OF CHAR) : File;
  43. VAR fn: PathStr; F: File;
  44. BEGIN
  45.   GetName(Name,fn);
  46.   F := FioAsm.Create(fn);
  47.   IF F <= MaxHandle THEN
  48.     EOFstat[F] := TRUE;
  49.     RETURN F
  50.   END;
  51.   RETURN MAX(CARDINAL)
  52. END Create;
  53.  
  54. PROCEDURE Open(Name: ARRAY OF CHAR) : File;
  55. VAR
  56.   fn: PathStr; F: File;
  57. BEGIN
  58.   GetName(Name,fn);
  59.   F := FioAsm.Open(fn, FioAsm.InputOutput);
  60.   IF F <= MaxHandle THEN
  61.     EOFstat[F] := Size(F) = 0;
  62.     RETURN F
  63.   END;
  64.   RETURN MAX(CARDINAL)
  65. END Open;
  66.  
  67. PROCEDURE EOF(F: File): BOOLEAN;
  68. BEGIN
  69.   RETURN EOFstat[F]
  70. END EOF;
  71.  
  72. PROCEDURE RdChar(F: File ) : CHAR;
  73. VAR c : CHAR;
  74. BEGIN
  75.   OK := TRUE;
  76.   IF RdBin( F,c,1 ) = 0 THEN
  77.     OK := FALSE;
  78.     c  := CHR(26);
  79.   END;
  80.   EOFstat[F] := c = CHR(26);
  81.   RETURN c;
  82. END RdChar;
  83.  
  84. PROCEDURE RdStr(F: File; VAR Buf: ARRAY OF CHAR);
  85. VAR
  86.   i,h : CARDINAL;
  87.   c   : CHAR;
  88. BEGIN
  89.   i  := 0;
  90.   h  := HIGH( Buf );
  91.   OK := TRUE;
  92.   LOOP
  93.      IF i > h THEN RETURN END;
  94.      c := RdChar( F );
  95.      IF c = CHR( 26 ) THEN
  96.        Buf[ i ] := CHR(0);
  97.        EOFstat[F] := i = 0;
  98.        RETURN;
  99.      ELSIF c = CHR( 13 ) THEN
  100.        Buf[ i ] := CHR(0);
  101.        RETURN;
  102.      ELSIF c # CHR( 10 ) THEN
  103.        Buf[ i ] := c;
  104.        INC( i );
  105.      END;
  106.   END;
  107. END RdStr;
  108.  
  109. PROCEDURE WrBin(F: File; Buf: ARRAY OF BYTE; Count: CARDINAL);
  110. BEGIN
  111.   OK := (Count = Write( F,Buf,Count ) ) AND (IOresult() = 0);
  112. END WrBin;
  113.  
  114. PROCEDURE RdBin(F: File; VAR Buf: ARRAY OF BYTE; Count: CARDINAL) : CARDINAL;
  115. VAR i : CARDINAL;
  116. BEGIN
  117.   i   := 0;
  118.   OK  := TRUE;
  119.   EOFstat[F] := FALSE;
  120.   IF Count > 0 THEN
  121.     i  := Read( F,Buf,Count );
  122.     OK := (IOresult() =0);
  123.     IF i < Count THEN EOFstat[F] := TRUE END;
  124.   END;
  125.   RETURN i;
  126. END RdBin;
  127.  
  128. PROCEDURE Exists(Name: ARRAY OF CHAR) : BOOLEAN;
  129. VAR d : FioAsm.DirEntry;
  130.     b : BOOLEAN ;
  131.     dta : ADDRESS;
  132. BEGIN
  133.   dta := FioAsm.GetDTA();
  134.   b := FioAsm.ReadFirstEntry(Name, FioAsm.FileAttr{},d);
  135.   FioAsm.SetDTA(dta);
  136.   RETURN b;
  137. END Exists;
  138.  
  139. PROCEDURE GetPos (F: File) : LONGCARD;
  140. BEGIN
  141.     RETURN FioAsm.GetPos(F, OK )
  142. END GetPos; 
  143.  
  144. PROCEDURE Size(F: File) : LONGCARD;
  145. VAR
  146.     p, q: LONGCARD;
  147. BEGIN
  148.   p := GetPos(F);
  149.   FioAsm.SeekEOF(F, OK);
  150.   q := GetPos(F);
  151.   FioAsm.Seek(F, p, OK);
  152.   RETURN q
  153. END Size;
  154.  
  155. PROCEDURE GetDir(drive: SHORTCARD; VAR Name: ARRAY OF CHAR);
  156. VAR
  157.   dr : ARRAY [0..2] OF CHAR;
  158. BEGIN
  159.   FioAsm.GetDir(drive, Name);
  160.   IF drive = 0 THEN drive := FioAsm.GetDrive() END;
  161.   dr[0] := CHR(drive + 64);
  162.   dr[1] := ':';
  163.   dr[2] := '\';
  164.   Concat(Name,dr,Name)
  165. END GetDir;
  166.  
  167. PROCEDURE ChDir (Name: ARRAY OF CHAR);
  168. BEGIN
  169.     IF Name[1] = ':' THEN
  170.          OK := FioAsm.SetDrive(VAL(SHORTCARD,CAP(Name[0]))-VAL(SHORTCARD,'@'));
  171.          IF (NOT OK) OR (Name[2] = 0C) THEN RETURN END;
  172.     END;
  173.     OK := FioAsm.ChDir(Name)
  174. END ChDir;
  175.  
  176. PROCEDURE Erase (Name: ARRAY OF CHAR);
  177. BEGIN
  178.     OK := FioAsm.Erase(Name)
  179. END Erase;
  180.  
  181. PROCEDURE Close (F: File);
  182. BEGIN
  183.     OK := FioAsm.Close(F);
  184. END Close; 
  185.  
  186. PROCEDURE Rename(Name,NewName : ARRAY OF CHAR);
  187. BEGIN
  188.     OK := FioAsm.Rename(Name,NewName);
  189. END Rename; 
  190.  
  191. BEGIN
  192.   Lib.Fill( ADR(EOFstat), SIZE(EOFstat), 0);
  193.   OK      := TRUE;
  194. END NFIO.
  195.  
  196.